
#include<iostream>
#include<pthread.h>
#include<ctime>
#include<sys/types.h>
#include<unistd.h>
#include"task.hpp"
#include"annulusqueue.hpp"

using namespace std;

// void* productor(void* args)
// {
//    annulusqueue<Caltask>* aq=static_cast<annulusqueue<Caltask>*>(args);
//     while(true)
//     {
//  int x=rand()%1000;
//  int y=rand()%500;
//  int num=rand()%oper.size();
//  Caltask cal(x,y,oper[num],mymath);

// aq->push(cal);//把cal任务放进环形队列
// cout<<"productor produce caltask: "<<cal.taskstringforP()<<endl;
// sleep(1);
//     }
// return nullptr;
// }

// void* consumer(void* args)
// {
//     annulusqueue<Caltask>* caq=static_cast<annulusqueue<Caltask>*>(args);
//     while(true)
//     {
//         Caltask ret;
//         caq->pop(&ret);//把计算任务取出来
//         cout<<"consumer get caltask: "<<ret()<<endl;//执行计算任务的（）重载函数即打印计算式
//         //sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
// srand((unsigned int)time(nullptr)^getpid());//随机数种子
// annulusqueue<Caltask>* aq=new annulusqueue<Caltask>();
//     pthread_t p,c;//线程
//     pthread_create(&p,nullptr,productor,aq);
//     pthread_create(&c,nullptr,consumer,aq);
    

// pthread_join(p,nullptr);
// pthread_join(c,nullptr);

// delete aq;
//     return 0;
// }

string threadname()
{
    char name[128];
    snprintf(name,sizeof name,"thread[0x%x]",pthread_self());
    return name;
}

void* productor(void* args)
{
   annulusqueue<int>* aq=static_cast<annulusqueue<int>*>(args);
    while(true)
    {
 int num=rand()%100;
aq->push(num);
cout<<threadname()<<"productor produce num: "<<num<<endl;
//sleep(1);
    }
return nullptr;
}

void* consumer(void* args)
{
    annulusqueue<int>* caq=static_cast<annulusqueue<int>*>(args);
    while(true)
    {
        int ret;
        caq->pop(&ret);
        cout<<threadname()<<"consumer get num: "<<ret<<endl;
     //   sleep(1);
    }
    return nullptr;
}

int main()
{
srand((unsigned int)time(nullptr)^getpid());//随机数种子
annulusqueue<int>* aq=new annulusqueue<int>();
   // pthread_t p,c;//线程
    pthread_t p[5],c[20];
    for(int i=0;i<2;i++)pthread_create(p+i,nullptr,productor,aq);
    for(int i=0;i<3;i++)pthread_create(c+i,nullptr,consumer,aq);
    // pthread_create(&p,nullptr,productor,aq);
    // pthread_create(&c,nullptr,consumer,aq);
    
 
 for(int i=0;i<4;i++) pthread_join(p[i],nullptr);
 for(int i=0;i<8;i++) pthread_join(c[i],nullptr);

delete aq;
    return 0;
}